#ifndef __PID_H__
#define __PID_H__

typedef struct
{
	float Need_Value;//预期值
	float Now_Value;//当前值

	float Ek;//本次误差
	float Ek_1;//上一次误差
	float Sum_Ek;//误差积分
	float Del_Ek;//误差差分
	float Ek_low;//误差为0阈值下限
	float Ek_up;//误差为0阈值上限

	float Kp;//Kp
	float Ki;//Ki
	float Kd;//Kd

	float P_OUT;//比例输出
	float I_OUT;//积分输出
	float D_OUT;//微分输出
	float OUT;//总输出
	float OUT_low;//输出限幅下限
	float OUT_up;//输出限幅上限
}PID_PositionInitTypedef;//位置式PID参数结构体

typedef struct
{
	float Need_Value;//预期值
	float Now_Value;//当前值

	float Ek;//本次误差
	float Ek_1;//上一次误差
	float Ek_2;//上两次误差
	float Ek_low;//误差为0阈值下限
	float Ek_up;//误差为0阈值上限

	float Kp;//Kp
	float Ki;//Ki
	float Kd;//Kd

	float P_OUT;//比例输出
	float I_OUT;//积分输出
	float D_OUT;//微分输出
	float OUT;//总输出
	float OUT_low;//输出限幅下限
	float OUT_up;//输出限幅上限
}PID_IncrementalInitTypedef;//增量式PID参数结构体

void PID_PositionStructureInit(PID_PositionInitTypedef* PID_InitStructure,float NeedValue);//位置式PID初始化结构体
void PID_PositionSetParameter(PID_PositionInitTypedef* PID_InitStructure,float kp,float ki,float kd);//位置式PID设置参数
void PID_PositionSetEkRange(PID_PositionInitTypedef* PID_InitStructure,float ek_low,float ek_up);//位置式PID设置误差为0阈值
void PID_PositionSetOUTRange(PID_PositionInitTypedef* PID_InitStructure,float out_low,float out_up);//位置式PID设置输出限幅
void PID_PositionClean(PID_PositionInitTypedef* PID_InitStructure);//位置式PID清理
void PID_PositionCalc(PID_PositionInitTypedef* PID_InitStructure,float NowValue);//位置式PID计算
void PID_IncrementalStructureInit(PID_IncrementalInitTypedef* PID_InitStructure,float NeedValue);//增量式PID初始化结构体
void PID_IncrementalSetParameter(PID_IncrementalInitTypedef* PID_InitStructure,float kp,float ki,float kd);//增量式PID设置参数
void PID_IncrementalSetEkRange(PID_IncrementalInitTypedef* PID_InitStructure,float ek_low,float ek_up);//增量式PID设置误差为0阈值
void PID_IncrementalSetOUTRange(PID_IncrementalInitTypedef* PID_InitStructure,float out_low,float out_up);//增量式PID设置输出限幅
void PID_IncrementalCalc(PID_IncrementalInitTypedef* PID_InitStructure,float NowValue);//增量式PID计算

#endif
